package com.itany.corejava.code08_常用类.string类;

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author 石小俊
 * 2024年07月19日 16:40
 */
public class Test06_练习 {

    private static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        //checkPhone();
        //checkPersonId();
        //checkEmail();
        //checkUsername();
        test04();
    }

    /**
     * 在控制台输入一个手机号码,判断手机号码格式是否正确
     * 手机号码格式如果正确,则返回手机号码格式正确
     * 手机号码格式如果不正确,提示手机号码格式不正确,请重新输入,且必须重新输入,直到正确为止
     * 手机号码由11位数字组成,必须以13、15、16、18、19开头
     */
    public static void checkPhone() {
        System.out.print("请输入一个手机号码:");
        String phone = sc.nextLine();
        if (phone.matches("1[35689]\\d{9}")) {
            System.out.println("提示:手机号码格式正确");
        } else {
            System.out.println("错误:手机号码格式不正确,请重新输入!");
            checkPhone();
        }
    }

    /**
     * 在控制台输入一个身份证号码,判断身份证号码格式是否正确
     * 身份证号码只能是15位或者18位字符
     * 如果是15位,要求必须全部是数字
     * 如果是18位,要求前17位必须全部是数字,最后一位可以是数字或者X
     */
    public static void checkPersonId() {
        System.out.print("请输入一个身份证号码:");
        String personId = sc.nextLine();
        if (personId.matches("\\d{15}(\\d{2}[0-9X])?")) {
            System.out.println("提示:身份证号码格式正确");
        } else {
            System.out.println("错误:身份证号码格式不正确,请重新输入!");
            checkPersonId();
        }
    }

    /**
     * 在控制台输入一个电子邮箱,判断电子邮箱格式是否正确
     * 要求邮箱必须以英文字母或者数字开头,后面可以跟英文字母数字或者下划线
     * 后面跟@符号,@符号后面跟英文字母或者数字
     * 以.com或者.com.cn结尾
     */
    public static void checkEmail() {
        System.out.print("请输入一个电子邮箱号码:");
        String email = sc.nextLine();
        if (email.matches("[a-zA-Z0-9]\\w+@[0-9A-Za-z]+\\.com(\\.cn)?")) {
            System.out.println("提示:电子邮箱号码格式正确");
        } else {
            System.out.println("错误:电子邮箱号码格式不正确,请重新输入!");
            checkEmail();
        }
    }

    /**
     * 在控制台输入一个用户名,判断用户名格式是否正确
     * 用户名由字母、数字、下划线、点、减号组成,只能以数字字母开头和结尾,长度4-18位
     */
    public static void checkUsername() {
        System.out.print("请输入一个用户名:");
        String email = sc.nextLine();
        if (email.matches("[a-zA-Z0-9][a-zA-Z0-9_.-]{2,16}[0-9A-Za-z]")) {
            System.out.println("提示:用户名格式正确");
        } else {
            System.out.println("错误:用户名格式不正确,请重新输入!");
            checkUsername();
        }
    }

    /**
     * 控制台输入一个字符串,统计字符串包含多少个数字、英文字母以及其他字符
     */
    public static void test01() {
        System.out.print("请输入一个字符串:");
        String s = sc.nextLine();
        // 为了便于统计英文字母,可以将字符串中英文字母统一进行大写或者小写后再去统计
        s = s.toUpperCase();
        // 定义三个变量,分别用于接收数字、英文字母、其他字符的出现次数
        int count1 = 0, count2 = 0, count3 = 0;
        // 遍历字符串
        for (int i = 0; i < s.length(); i++) {
            // 取出当前迭代的字符
            char c = s.charAt(i);
            // 判断该字符的类型
            if (c >= '0' && c <= '9') {
                count1++;
            } else if (c >= 'A' && c <= 'Z') {
                count2++;
            } else {
                count3++;
            }
        }
        System.out.println("当前字符串中数字出现了" + count1 + "次,英文字母出现了" + count2 + "次,其他字符出现了" + count3 + "次");
    }

    /**
     * 控制台输入一个字符串,统计每个字母出现的次数(忽略大小写)并输出
     */
    public static void test02() {
        System.out.print("请输入一个字符串:");
        String s = sc.nextLine();
        s = s.toLowerCase();
        // 将字符串转换成char数组
        char[] cs = s.toCharArray();
        // 由于英文字母共有26个,如果使用分支判断一个个的进行比较过于麻烦了
        // 那么我们可以思考是否有办法自动进行26个字母的比较?
        // 英文字母也是存在顺序,并且可以进行大小比较与运算
        // 可以遍历这26个英文字母
        for (char i = 'a'; i <= 'z'; i++) {
            // 每一个英文字母与指定字符串比较一次
            // 定义一个变量,接收该字母出现的次数
            int count = 0;
            for (char c : cs) {
                if (i == c) {
                    count++;
                }
            }
            // 内层循环遍历结束之后打印当前字母出现的次数
            // 如果每个字母都进行打印,某些没有出现过的也打印了,有点多余
            // 因此,我们可以只打印出现过的字母
            if (count > 0) {
                System.out.println("字母" + i + "出现的次数为:" + count);
            }
        }
    }

    /**
     * 控制台输入一个字符串,对字符串中字符进行自然顺序的排序,将排序后的字符串展示出来
     */
    public static void test03() {
        System.out.print("请输入一个字符串:");
        String s = sc.nextLine();
        // 将字符串转换成字符数组
        char[] cs = s.toCharArray();
        // 调用Arrays工具类中的排序方法
        // 该方法对于字符会自动进行自然顺序的排序
        Arrays.sort(cs);
        String result = new String(cs);
        System.out.println("排序后的字符串为:" + result);
    }

    /**
     * 控制台输入两个字符串,计算第二个字符串在第一个字符串中出现的次数
     */
    public static void test04() {
        System.out.print("请输入第一个字符串:");
        String s = sc.next();
        System.out.print("请输入第二个字符串:");
        String s2 = sc.next();
        // 准备一个变量,用于接收出现的次数
        int count = 0;
        // 准备一个变量,用于接收该字符串第一个出现的索引位置
        int index = 0;
        while ((index = s.indexOf(s2)) != -1) {
            // 只要找到了,进入该循环了,说明存在次数多了一次
            count++;
            // 将找到的字符串以前字符串前面的内容全部截取掉
            s = s.substring(index + s2.length());
            // 截取掉了之后,使用截取后的字符串再次进入循环判断
            // 直到找不到为止,当找不到时返回值为-1
        }
        // 循环结束之后打印出现的次数
        System.out.println("第二个字符串在第一个字符串中出现了:" + count + "次");

    }
}
